#pragma once
#include <string>
#include <unordered_map>


namespace zgwrpc
{
    // 定义消息头字段
#define KEY_METHOD          "method"        //方法名    
#define KEY_PARAMS          "parameters"    //参数
#define KEY_TOPIC_KEY       "topic_key"     //主题关键字  主题特有
#define KEY_TOPIC_MSG       "topic_msg"     //主题消息    主题特有
#define KEY_OPTYPE          "optype"        //操作类型
#define KEY_HOST            "host"          //主机地址    Service特有
#define KEY_HOST_IP         "ip"            //主机IP      Service特有
#define KEY_HOST_PORT       "port"          //主机端口    Service特有
#define KEY_RCODE           "rcode"         //响应码
#define KEY_RESULT          "result"        //响应结果
 

    // 定义消息类型
    enum class MType         //消息类型
    {
        REQ_RPC = 0,   // 请求RPC
        RSP_RPC,         // 响应RPC
        REQ_TOPIC,       // 请求主题
        RSP_TOPIC,       // 响应主题
        REQ_SERVICE,     // 请求服务
        RSP_SERVICE     // 响应服务
    };

    // 响应码类型定义
    enum class RCode
    {
        RCODE_OK=0,           //成功处理                        
        RCODE_PARSE_FAILED,   //解析消息失败
        RCODE_INVALID_MSG,    //无效的消息 ----消息中字段缺失等导致
        RCODE_DISCONNECTED,   //连接断开
        RCODE_INVALID_PARAMS, //无效的RPC参数调用
        RCODE_NOT_FOUND_SERVICE, //未找到服务
        RCODE_INVALID_OPTYPE, //无效的操作类型
        RCODE_NOT_FOUND_TOPIC, //未找到主题
        RCODE_INVALID_SERVICE, //无效的服务
    };

    static std::string errReason(RCode rcode)
    {
        static std::unordered_map<RCode, std::string> reasons = {
            {RCode::RCODE_OK, "成功处理"},
            {RCode::RCODE_PARSE_FAILED, "解析消息失败"},
            {RCode::RCODE_INVALID_MSG, "无效的消息"},
            {RCode::RCODE_DISCONNECTED, "连接断开"},
            {RCode::RCODE_INVALID_PARAMS, "无效的RPC参数调用"},
            {RCode::RCODE_NOT_FOUND_SERVICE, "未找到服务"},
            {RCode::RCODE_INVALID_OPTYPE, "无效的操作类型"},
            {RCode::RCODE_NOT_FOUND_TOPIC, "未找到主题"},        
            {RCode::RCODE_INVALID_SERVICE, "无效的服务"}};
            auto it = reasons.find(rcode);
            if(it!= reasons.end())
            {
                return it->second;
            }
            return "未知错误";
        }


        // 定义请求方式
        enum class Rtype
        {
            REQ_SYNC = 0,   // 请求同步
            REQ_ASYNC,         // 请求异步
            REQ_CALLBACK ,       // 请求回调
        };


        //主题操作类型
        enum class TopicOpType
        {
            TOPIC_CREATE = 0,   // 创建主题
            TOPIC_REMOVE,         // 删除主题
            TOPIC_SUBSCRIBE,       // 订阅主题
            TOPIC_CANCEL,     // 取消订阅主题
            TOPIC_PUBLISH,     // 发布主题
        };


        //服务操作类型
        enum class ServiceOpType
        {
            SERVICE_REGISTER = 0,   // 注册服务
            SERVICE_DISCOVERY,       // 发现服务
            SERVICE_ONLINE,     // 上线服务
            SERVICE_OFFLINE,     // 下线服务
        };
    
}